package org.example.new_hbps_backend_reconstruction.controller.patient;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.example.new_hbps_backend_reconstruction.common.results.R;
import org.example.new_hbps_backend_reconstruction.entity.DrugEatTimeEntity;
import org.example.new_hbps_backend_reconstruction.service.DrugEatTimeService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 丁利军
 * @date 2025年10月11日 21:07
 * @description TODO: 描述
 */

@RestController
@RequiredArgsConstructor
@RequestMapping("/patient/drugEatTime")
@Tag(description = "drugEatTime", name = "用药时间对照表（因为一款药可能需要多个时间）管理")
@Slf4j
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class DrugEatTimeController {

    private final DrugEatTimeService drugEatTimeService;

    @Operation(summary = "查询用药时间", description = "查询用药时间")
    @PostMapping("/getByUserDrugEatTime")
    @PreAuthorize("@pms.hasPermission('patient_userDrugEatTime_view')")
    public R getByUserFeedbackObject(@RequestBody DrugEatTimeEntity userDrugEatTime) {
        LambdaQueryWrapper<DrugEatTimeEntity> wrapper = Wrappers.lambdaQuery();
        wrapper.setEntity(userDrugEatTime);
        return R.ok(drugEatTimeService.list(wrapper));
    }

    /**
     * 描述: 查询某个患者当天用药以及是否已经服用
     */
    @Operation(summary = "查询某个患者当天用药情况", description = "查询某个患者当天用药情况")
    @GetMapping("/getTodayDrugEatTime/{patientUid}")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_view')")
    public R getTodayDrugEatTime(@PathVariable("patientUid") Long patientUid) {
        return R.ok(drugEatTimeService.getTodayDrugEatTime(patientUid));
    }

    /**
     * 描述: 服用某个用药计划中的某个时间段请求，正常只需传入pepId即可
     */
    @Operation(summary = "服用某个用药计划中的某个时间段", description = "服用某个用药计划中的某个时间段")
    @PostMapping("/eatDrug")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_edit')")
    public R eatDrug(@RequestBody DrugEatTimeEntity drugEatTime) {
        try {
            drugEatTimeService.eatDrug(drugEatTime);
            return R.ok();
        } catch (Exception e) {
            log.error("提交服药请求失败", e);
            return R.failed();
        }
    }

    /**
     * 分页查询
     *
     * @param page        分页对象
     * @param drugEatTime 用药时间对照表（因为一款药可能需要多个时间）
     * @return
     */
    @Operation(summary = "分页查询", description = "分页查询")
    @GetMapping("/page")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_view')")
    public R getDrugEatTimePage(@ParameterObject Page page,
                                @ParameterObject DrugEatTimeEntity drugEatTime) {
        LambdaQueryWrapper<DrugEatTimeEntity> wrapper = Wrappers.lambdaQuery();
        return R.ok(drugEatTimeService.page(page, wrapper));
    }


    /**
     * 通过id查询用药时间对照表（因为一款药可能需要多个时间）
     *
     * @param pepId id
     * @return R
     */
    @Operation(summary = "通过id查询", description = "通过id查询")
    @GetMapping("/{pepId}")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_view')")
    public R getById(@PathVariable("pepId") Long pepId) {
        return R.ok(drugEatTimeService.getById(pepId));
    }

    /**
     * 新增用药时间对照表（因为一款药可能需要多个时间）
     *
     * @param drugEatTime 用药时间对照表（因为一款药可能需要多个时间）
     * @return R
     */
    @Operation(summary = "新增用药时间对照表（因为一款药可能需要多个时间）", description = "新增用药时间对照表（因为一款药可能需要多个时间）")
    //@SysLog("新增用药时间对照表（因为一款药可能需要多个时间）")
    @PostMapping
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_add')")
    public R save(@RequestBody DrugEatTimeEntity drugEatTime) {
        return R.ok(drugEatTimeService.save(drugEatTime));
    }

    /**
     * 修改用药时间对照表（因为一款药可能需要多个时间）
     *
     * @param drugEatTime 用药时间对照表（因为一款药可能需要多个时间）
     * @return R
     */
    @Operation(summary = "修改用药时间对照表（因为一款药可能需要多个时间）", description = "修改用药时间对照表（因为一款药可能需要多个时间）")
    //@SysLog("修改用药时间对照表（因为一款药可能需要多个时间）")
    @PutMapping
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_edit')")
    public R updateById(@RequestBody DrugEatTimeEntity drugEatTime) {
        return R.ok(drugEatTimeService.updateById(drugEatTime));
    }

    /**
     * 通过id删除用药时间对照表（因为一款药可能需要多个时间）
     *
     * @param ids pepId列表
     * @return R
     */
    @Operation(summary = "通过id删除用药时间对照表（因为一款药可能需要多个时间）", description = "通过id删除用药时间对照表（因为一款药可能需要多个时间）")
    //@SysLog("通过id删除用药时间对照表（因为一款药可能需要多个时间）")
    @DeleteMapping
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_del')")
    public R removeById(@RequestBody Long[] ids) {
        return R.ok(drugEatTimeService.removeBatchByIds(CollUtil.toList(ids)));
    }


    /**
     * 导出excel 表格
     *
     * @param drugEatTime 查询条件
     * @param ids         导出指定ID
     * @return excel 文件流
     */
    //@ResponseExcel
    @GetMapping("/export")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_export')")
    public List<DrugEatTimeEntity> export(DrugEatTimeEntity drugEatTime, Long[] ids) {
        return drugEatTimeService.list(Wrappers.lambdaQuery(drugEatTime)
                .in(ArrayUtil.isNotEmpty(ids), DrugEatTimeEntity::getPepId, ids));
    }


    @Operation(summary = "全条件查询反馈信息", description = "全条件查询反馈信息")
    @PostMapping("/getByDrugEatTimeObject")
    @PreAuthorize("@pms.hasPermission('patient_drugEatTime_view')")
    public R getByDrugEatTimeObject(@RequestBody DrugEatTimeEntity drugEatTime) {
        LambdaQueryWrapper<DrugEatTimeEntity> wrapper = Wrappers.lambdaQuery();
        wrapper.setEntity(drugEatTime);
        return R.ok(drugEatTimeService.list(wrapper));
    }

}